## Bibliotecas e Dados----------------------------------------------------------

library(tidyverse)
library(hrbrthemes)
library(patchwork)
library(janitor)
library(reshape2)
library(scales)
library(widyr)
library(ggridges)
Sys.setlocale("LC_TIME", 'portuguese')
options(scipen = 999)


### dados
load(file = "polarizacao_all.Rdata")

# Excluir imprensa tradicional da classificação ideológica
paginas$esq_dir[paginas$NATUREZA == "Imprensa"] <- "Imprensa"

# Mesclar
posts <-  data_final %>% filter(!ano %in% c(2010, 2020)) %>%  
  inner_join(paginas)

posts <- posts %>% distinct(post_id, .keep_all = T)
rm(data_final)


# Função para normalizar -1 a 1

scale <- function(vector = NULL,
           lower_bound = NULL,
           upper_bound = NULL) {
    if (is.null(vector)) {
      stop("Please provide input")
    } else if (is.null(lower_bound)) {
      stop("Please provide lower bound")
    } else if (is.null(upper_bound)) {
      stop("Please provide upper bound")
    }
    
    min <- min(vector)
    max <- max(vector)
    a <- lower_bound
    b <- upper_bound
    
    new <- lapply(vector, function(x)
      ((b - a) * (x - min) / (max - min)) + a)
    return(unlist(new))
  }


# Contagens
paginas %>% tabyl(esq_dir)
posts %>% tabyl(esq_dir)

# Categoria -----------------------------------------------------------------


# Atribuir categoria Imprensa ou Mídia Alternativa
imp <- filter(posts, NATUREZA == "Imprensa")

f <- imp %>%
  group_by(domain) %>%
  summarise(n = n()) %>%
  arrange(-n) %>%
  na.omit() %>%
  head(150)

# adicionar classificação
posts$tipo <-  posts$domain %in% f$domain
posts$tipo <-
  ifelse(posts$tipo == "TRUE", "Imprensa", "Mídia Alternativa")

# Gerar filtro de posts sem domínios publicados pelas fan pages da própria imprensa
out <- filter(posts, NATUREZA != "Imprensa")

# Predominancia -----------------------------------------------------------
# Frequência de posts
all_posts <- posts %>%  filter(!NATUREZA %in% c("Imprensa")) %>%
  tabyl(esq_dir) %>%
  select(-n) %>%
  pivot_wider(names_from = esq_dir, values_from = percent)

# Excluir domínios não pertinentes à pesquisa
excluir_dom <- c(
  "",
  "medium.com",
  "flickr.com",
  "vimeo.com",
  "google.com",
  "media.giphy.com",
  "blogger.com",
  "issuu.com",
  "i.giphy.com",
  "twitcasting.tv",
  "twibbon.com",
  "va.mu",
  "noisey.vice.com",
  "br.rfi.fr",
  "esporte.uol.com.br",
  "hugedomains.com",
  "networkedblogs.com",
  "outline.com",
  "feedproxy.google.com",
  "elcoyote.org",
  "drive.google.com",
  "ucrania-mozambique.blogspot.com"
)

# Listar 500 domínios mais citados
domain_list <- posts %>%
  filter(
    !domain %in% excluir_dom,
    NATUREZA != "Imprensa"
  ) %>%
  count(domain) %>%
  arrange(-n) %>%
  head(500)

## Sumário descritivo dos domínios
domain_desc <- posts %>%
  filter(domain %in% domain_list$domain) %>%
  group_by(domain) %>%
  summarise(
    n = n(), # Total de Posts
    n_pages = n_distinct(from_id), # Quantas páginas citaram
    shares_sum = sum(shares, na.rm = T), # Total de compartilhamentos
    shares_mean = mean(shares, na.rm = T), # Média de compartilhamentos
    n_year = n_distinct(ano) # Em quantos anos o domínio foi citado ao menos uma vez
  )  %>%
  mutate(percent_p = round((n / sum(n)) * 100, 2)) %>%
  na.omit %>%
  arrange(-n) %>%
  select(domain, n,  percent_p, n_pages, shares_sum, shares_mean, n_year)

# criar tabela descritiva
proportions <- posts %>%
  filter(!NATUREZA %in% c("Imprensa")) %>%
  filter(domain %in% domain_desc$domain) %>%
  select(esq_dir, domain) %>%
  na.omit() %>%
  tabyl(domain, esq_dir) %>%
  mutate(
    normalized_esq = Esquerda / all_posts$Esquerda, # Ajustar percentual de acordo com o número total de posts
    normalized_dir = Direita / all_posts$Direita # Ajustar percentual de acordo com o número total de posts
  ) %>%
  select(-Direita,-Esquerda) %>%
  adorn_percentages()

# Integrar com sumário
proportions <- proportions %>%  inner_join(domain_desc)

# Adicionar classificação
proportions$tipo <-  proportions$domain %in% f$domain
proportions$tipo <-
  ifelse(proportions$tipo == "TRUE", "Imprensa", "Mídia Alternativa")


# Criar intervalos segundo Messing
proportions <-  proportions %>%
  mutate(
    faixa = case_when(
      # case_when recebe os condicionais
      normalized_dir == 1 ~ "esc_dir",
      normalized_dir >= .75 & normalized_dir < 1 ~ "pred_dir",
      normalized_dir < .75 & normalized_dir > .3  ~ "medio",
      normalized_esq == 1 ~ "esc_esq",
      normalized_esq > .75 & normalized_esq < 1 ~ "pred_esq"
    )
  )


# H1 MPAS --------------------------------------------------------------------
# Normalizar proporção e criar MPAS
proportions$mpas <-  scale(proportions$normalized_dir,-1, 1)

# Criar intervalos por decis
proportions <- proportions %>%
  mutate(quartile_10 = ntile(mpas, 10))

# Estatísticas Descritivas  MPAS
mean(proportions$mpas)
median(proportions$mpas)
sd(proportions$mpas)
hist(proportions$mpas)
quantile(proportions$normalized_dir,  probs = seq(0, 1, 1 / 10)) # quantile


# Cosine similarity -------------------------------------------------------
# Entre os grupos
domain_simi <- posts %>%
  filter(domain %in% domain_list$domain,
         NATUREZA != "Imprensa") %>%
  count(esq_dir, domain) %>% 
  filter(n > 3)


# Exportar Dados
write.csv(domain_simi, "domain_simi_data.csv")

domain_simi %>%
  pairwise_similarity(esq_dir, domain, n, upper = F)

# Esquerda
domain_simi_esq <- posts %>%
  filter(domain %in% domain_list$domain,
         esq_dir == "Esquerda") %>%
  count(from_name, domain)%>% 
  filter(n > 3)

# Exportar Dados
write.csv(domain_simi_esq, "domain_simi_esq.csv")

# Calcular
domain_simi_esq %>%
  pairwise_similarity(from_name, domain, n, upper = F) %>%
  summarise(mean = mean(similarity))

# Direita
domain_simi_dir <- posts %>%
  filter(domain %in% domain_list$domain,
         esq_dir == "Direita") %>%
  count(from_name, domain)%>% 
  filter(n > 3)

# Calcular
domain_simi_dir %>%
  pairwise_similarity(from_name, domain, n, upper = F) %>%
  summarise(mean = mean(similarity))

# Exportar Dados
write.csv(domain_simi_dir, "domain_simi_dir.csv")

# H2 MPAS Tipo ------------------------------------------------------------
posts %>% tabyl(tipo)
posts %>% tabyl(esq_dir, tipo) %>% adorn_percentages('row')



# H2 Idade ---------------------------------------------------------------------
# Imprensa
proportions %>%
  filter(tipo == "Imprensa") %>%
  summarise(age_mean = mean(n_year))

# Mídia Alternativa
proportions %>%
  filter(tipo == "Mídia Alternativa") %>%
  summarise(age_mean = mean(n_year))

# Idade dos domínios por decil
proportions %>%
  filter(tipo == "Mídia Alternativa") %>%
  group_by(quartile_10) %>%
  summarise(age_mean = mean(n_year))

# Idade top 5 Imprensa
tmp <- proportions %>%
  filter(tipo != "Mídia Alternativa") %>%
  arrange(-shares_sum) %>%
  head(5)

# Idade Top 5 polarizado
tmp <- proportions %>%
  filter(tipo == "Mídia Alternativa" &
           quartile_10 %in% c(1, 2, 3, 7,8, 9, 10)) %>% # filtrar 5 polarizados de esquerda e de direita
  mutate(ideo = ifelse(normalized_dir > .5, "Direita", "Esquerda")) %>%
  group_by(ideo) %>%
  arrange(-shares_sum) %>% 
  top_n(5, shares_sum)  %>%
  bind_rows(tmp)

# Calcular shares
year_shares <- posts %>%
  filter(domain %in% tmp$domain) %>%
  group_by(ano, domain) %>%
  summarise(sum_shares = sum(shares)) %>%
  inner_join(select(tmp, domain, ideo))

# Corrigir na
year_shares$ideo[is.na(year_shares$ideo)] <- "Imprensa"

# Criar total
year_shares <- year_shares %>% group_by(ideo) %>% mutate(n = prettyNum(sum(sum_shares), ".")) %>%
  mutate(label = paste0(ideo, " Total = ", n),
         domain_n = paste0(domain, "n = ", prettyNum(sum(sum_shares)))) %>%
  select(-n) %>%
  inner_join(year_shares)

year_shares <- year_shares %>% mutate(name2 = label) %>%
  as.data.frame() %>% select(-ideo)

year_shares <- year_shares %>%
  mutate(ano = as.Date(paste0(ano, "/01/01"))) %>%
  droplevels()


# H3 Series temporais --------------------------------------------------------
# Criar tabela de posts por ano
tmp <- out %>%
  filter(tipo == "Imprensa")  %>%
  tabyl(ano, esq_dir)

# Organizar formato
tmp <- tmp %>%
  melt()

# Ajustar de acordo com o total de posts dos grupos
all_posts_ano <- posts %>%
  filter(esq_dir != "Centro", NATUREZA != "Imprensa") %>%
  tabyl(esq_dir, ano) %>%
  adorn_percentages(denominator = "col") %>%
  pivot_longer(!esq_dir, names_to = "ano", values_to = "percent")

# Renomear
names(tmp)[2] <- "esq_dir"

# Aplicar Normalização
res_normalized <- tmp %>%
  inner_join(all_posts_ano) %>%
  mutate(normalized = value / percent)

# Organizar formato
res_normalized <- res_normalized %>%
  select(ano, esq_dir, normalized) %>%
  spread(esq_dir, normalized) %>%
  mutate(
    sum = Esquerda + Direita,
    Esquerda = Esquerda / sum,
    Direita = Direita / sum
  ) %>%
  select(ano, Esquerda, Direita)  %>%
  melt()



# H3 Serie dominios ----------------------------------------------------------
# Gerar tabela 
tmp <- out %>%
  group_by(domain, esq_dir, ano) %>%
  summarise(n = n())  %>%
  ungroup() %>%
  arrange(-n) %>%
  select(domain, n, esq_dir, ano)  %>%
  na.omit %>%
  inner_join(all_posts_ano)


# Ajustar de acordo com total de posts
res_normalized_dom <- tmp %>%
  filter( # Selecionar 9 domínios
    domain %in% c(
      "folha.uol",
      "estadao",
      "veja.abril.com.br",
      "exame.abril.com.br",
      "noticias.noticias.r7.com",
      "oglobo.globo.com",
      "epoca.globo.com",
      "gazetadopovo.com.br",
      "jovempan.uol.com.br"
    )
  ) %>%
  mutate(normalized = n / percent) %>%
  select(domain, ano , esq_dir, normalized) %>%
  spread(esq_dir, normalized) %>%
  mutate(
    sum = Esquerda + Direita,
    Esquerda = Esquerda / sum,
    Direita = Direita / sum
  ) %>%
  select(domain, ano, Esquerda, Direita)  %>%
  melt()



# H3 Percentual imprensa ajustado --------------------------------------------------------

# Criar tabela
t1 <- out %>%
  group_by(esq_dir, ano) %>%
  summarise(total = n()) %>%
  na.omit()


## Posts por ano
tmp <- out %>%
  group_by(tipo, esq_dir, ano) %>%
  summarise(n = n())  %>%
  ungroup() %>%
  arrange(-n) %>%
  select(tipo, n, esq_dir, ano)  %>%
  na.omit

# Ajustar
ajst <- inner_join(tmp, t1) %>%
  mutate(ajustado = n / total)


# Exportar Rdata ----------------------------------------------------------

save(paginas, proportions, all_posts, all_posts_ano, 
     domain_desc, domain_list, domain_simi, domain_simi_dir, 
     domain_simi_esq, ajst, res_normalized, res_normalized_dom, year_shares, 
     file = "data_tables.Rdata")
